import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:客户端
 * User: 87111
 * Date: 2025-11-18
 * Time: 21:24
 */
public class TcpEchoClient {
    private Socket socket = null;

    //通过构造方法传入要连接的服务器
    public TcpEchoClient(String serverIP,int serverPort) throws IOException {
        //直接把服务器的IP和端口号作为参数传进来
        //该对象直接在底层和服务端建立连接，保存了对端的信息
        socket = new Socket(serverIP,serverPort);
    }

    public void start() {
        Scanner sc = new Scanner(System.in);
        try(InputStream inputStream = socket.getInputStream();
            OutputStream outputStream = socket.getOutputStream()) {
            //为了使用方便进行套壳处理
            //接收响应
            Scanner scanner = new Scanner(inputStream);
            //发送请求
            PrintWriter writer = new PrintWriter(outputStream);

            //从控制台读取请求，发送给服务器
            while(true) {
                System.out.println("请输入发送的内容：");
                //1.从控制台读取请求
                String request = sc.next();
                //2.将请求发送给服务器
                //这里的发送请求给服务器，是先将请求放在“发送缓冲区”（内存里），并没有真正发送给网卡，而是累积到一定程度后一起发送。
                //这里是自动加上换行的，如果不加换行，服务器端在读取时候就会阻塞，没有读到空白字符。
                //TCP中默认按照空白符分开每个请求
                writer.println(request);
                //刷新缓冲区，真正发送数据
                writer.flush();
                //3.读取服务器返回的响应
                String response = scanner.next();
                //4.将响应打印出来
                System.out.println(response);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) throws IOException {
        TcpEchoClient client = new TcpEchoClient("127.0.0.1",9090);
        client.start();
    }
}
